package com.suiwei.base;

public class InnerClass {
  public static void main(String[] args) {
    // 成员内部类对象创建格式
    Outer.Inner in = new Outer().new Inner();
    // 静态内部类创建对象格式
    Outer.StaticInner inStatic = new Outer.StaticInner();
    /**
     * 匿名内部类；本质上是一个特殊的局部内部类，定义在方法内部
     * 当调用的方法的形参是接口类型，那么就是要传入接口的实现类对象，
     * 要么自己写实现类创建对象传入，要么就用匿名内部类
     *    匿名内部类可以作为方法的实际参数进行传递
     * 语法：
     *     new 类名(){}:继承“类名”，并直接创建对象
     *     new 接口(){}:实现“接口”，并接创建对象
     * 作用：代码更简洁，可以在定义一个类的同时对其进行实例化
     * 概念：过程中没有出现新类的名字，所以叫匿名；定义在方法内部，所以叫内部类；
     */
    use(
        new Person() {
          @Override
          public void show() {
            System.out.println("匿名内部类");
          }
        });
  }

  public static void use(Person p) {
    p.show();
  }
}

class Outer {
  private void method() {
    System.out.println("外部类");
    // 外部类访问内部类成员：需要先创建对象
    Inner in = new Inner();
    System.out.println(in.num);
  }
  // 成员内部类
  class Inner {
    int num = 10;

    public void show() {
      System.out.println("内部类");
      // 内部类访问外部类成员：直接用，包括私有
      method();
    }
  }
  // 静态内部类
  static class StaticInner {
    int num = 10;

    public void show() {
      System.out.println("内部类");
    }
  }
}

interface Person {
  void show();
}
